fontchooserdialog: Fix disposing
authorMatthias Clasen <mclasen@redhat.com>
Sat, 9 May 2020 18:10:38 +0000 (14:10 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 11 May 2020 16:19:39 +0000 (12:19 -0400)
We need to drop our widgetry in dispose to prevent
leakage.

gtk/gtkfontchooserdialog.c

index 11d17c966875a28e54bcc8e2600907b2ca5aae67..9083806f89debd40b5edf3cecb6206cdbbb85cc4 100644 (file)
@@ -48,7 +48,6 @@ struct _GtkFontChooserDialog
   GtkDialog parent_instance;
 
   GtkWidget *fontchooser;
-
   GtkWidget *select_button;
   GtkWidget *cancel_button;
   GtkWidget *tweak_button;
@@ -200,12 +199,49 @@ gtk_font_chooser_dialog_map (GtkWidget *widget)
   GTK_WIDGET_CLASS (gtk_font_chooser_dialog_parent_class)->map (widget);
 }
 
+static void
+update_button (GtkFontChooserDialog *dialog)
+{
+  PangoFontDescription *desc;
+
+  desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (dialog->fontchooser));
+
+  gtk_widget_set_sensitive (dialog->select_button, desc != NULL);
+
+  if (desc)
+    pango_font_description_free (desc);
+}
+
+static void
+gtk_font_chooser_dialog_dispose (GObject *object)
+{
+  GtkFontChooserDialog *dialog = GTK_FONT_CHOOSER_DIALOG (object);
+
+  if (dialog->fontchooser)
+    {
+      g_signal_handlers_disconnect_by_func (dialog->fontchooser,
+                                            update_button,
+                                            dialog);
+      g_signal_handlers_disconnect_by_func (dialog->fontchooser,
+                                            update_tweak_button,
+                                            dialog);
+    }
+
+  g_clear_pointer (&dialog->select_button, gtk_widget_unparent);
+  g_clear_pointer (&dialog->cancel_button, gtk_widget_unparent);
+  g_clear_pointer (&dialog->tweak_button, gtk_widget_unparent);
+  g_clear_pointer (&dialog->fontchooser, gtk_widget_unparent);
+
+  G_OBJECT_CLASS (gtk_font_chooser_dialog_parent_class)->dispose (object);
+}
+
 static void
 gtk_font_chooser_dialog_class_init (GtkFontChooserDialogClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  gobject_class->dispose = gtk_font_chooser_dialog_dispose;
   gobject_class->get_property = gtk_font_chooser_dialog_get_property;
   gobject_class->set_property = gtk_font_chooser_dialog_set_property;
 
@@ -225,20 +261,6 @@ gtk_font_chooser_dialog_class_init (GtkFontChooserDialogClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, dialog_forward_key);
 }
 
-static void
-update_button (GtkFontChooserDialog *dialog)
-{
-  PangoFontDescription *desc;
-
-  desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (dialog->fontchooser));
-
-  gtk_widget_set_sensitive (dialog->select_button, desc != NULL);
-
-  if (desc)
-    pango_font_description_free (desc);
-}
-
-
 static void
 gtk_font_chooser_dialog_init (GtkFontChooserDialog *dialog)
 {